package com.fanco.learn_datastruct_leetcode.leetcode;

import java.util.ArrayList;
import java.util.List;

/**
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * <p>
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 * <p>
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 *
 * @author qiaowang 2021/4/23
 * log:
 * 0727 回顾
 */
public class Day06 {
    public static void main(String[] args) {
        Solution solution = new Solution();
        String result = solution.convert("ab", 3);

        System.out.println(result);
    }

    private static class Solution {
        public String convert(String s, int numRows) {
            if (numRows == 1) {
                return s;
            }
            /**
             * 这里leetcode官方提供了多种方案，我挑了一种我理解起来比较轻松的一种
             */
            // 1.确定实际展示的行数 min(s.length, numRows)
            int rows = Math.min(s.length(), numRows);
            // 定义存储结构，存储每一行数据
            List<StringBuilder> list = new ArrayList<>();
            for (int i = 0; i < rows; i++) {
                list.add(new StringBuilder());
            }

            // 定义当前反向， true向上， false向下
            boolean goingDown = false;

            int curRow = 0;
            for (int i = 0; i < s.length(); i++) {
                list.get(curRow).append(s.charAt(i));
                if (curRow == 0 || curRow == numRows - 1) {
                    // 只有在第一行 或者 最后一行时需要进行改变方向。根据方向对行号做加减
                    goingDown = !goingDown;
                }
                curRow += (goingDown ? 1 : -1);
            }
            StringBuilder result = new StringBuilder();
            for (StringBuilder sb : list) {
                result.append(sb.toString() + "\n");
            }
            return result.toString();
        }
    }
}
